from django.db import models

# Create your models here.
from apps.oaauth.models import OAUser, OADepartment


class Inform(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()
    create_time = models.DateTimeField(auto_now_add=True)
    # 如果前端上传的Department中包含了 0  比如 [0] 那就认为这个通知是所有部门可见的
    public = models.BooleanField(default=False)
    author = models.ForeignKey(OAUser, on_delete=models.CASCADE, related_name='informs', related_query_name='informs')
    # department 序列化的时候用， 前端上传部门id，  通过 department_ids 来获取
    departments = models.ManyToManyField(OADepartment, related_name='informs', related_query_name='informs')

    #倒序排列
    class Meta:
        ordering = ('-create_time',)

class InformRead(models.Model):
    """
    related_name 属性允许你为外键关系指定一个反向引用名称。这意味着你可以通过这个名称，从被引用的模型（在这个例子中是 Inform 模型）实例访问到所有引用它的模型实例（在这个例子中是 InformRead 模型实例）。
    例如，如果设置 related_name='reads'，对于一个 Inform 实例 inform_instance，可以通过 inform_instance.reads.all() 访问所有与 inform_instance 相关联的 InformRead 实例。
    如果没有设置 related_name，Django 将使用默认的名称，该名称基于模型的名称和外键字段名。在这个例子中，默认名称可能是 informread_set。
    """
    inform = models.ForeignKey(Inform,on_delete=models.CASCADE, related_name='reads', related_query_name='reads')
    """
    related_query_name 属性用于指定反向查询时使用的查询名称。它允许你在查询中引用这个名称，以便筛选或获取特定的 InformRead 实例。
    这个属性主要用于 Django 的查询API，例如，你可以使用 InformRead.objects.filter(reads__user=current_user) 来获取当前用户读过的所有通知。
    如果没有设置 related_query_name，Django 将使用默认的名称，该名称基于模型的名称和外键字段名。
    """
    user = models.ForeignKey(OAUser,on_delete=models.CASCADE, related_name='reads', related_query_name='reads')
    read_time = models.DateField(auto_now_add=True)

    class Meta:  # 在InformRead模型中内嵌一个Meta类，用于指定模型的元数据。
        # inform和user组合的数据，必须是唯一的
        """
        ：Meta类中的这个属性表明，inform和user字段的组合在整个InformRead模型中必须是唯一的。
        这意味着一个用户在一个通知记录中只能被记录一次。
        """
        unique_together = ('inform', 'user')